package cn.cloud.project.consumer.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author: cql
 * @date: 2024/11/3
 * @description:
 */
@Configuration
public class AppConfig {

    /**
     * nacos默认集成了负载均衡组件，例如我们使用的是Ribbon，
     * （1）只要标注了@LoadBalanced注解的restTemplates都会添加负载均衡拦截器LoadBalancerInterceptor。
     * （2）restTemplate的http请求方法，最终会调用到doExecute方法。
     * （3）doExecute在发起http请求之前，会先执行LoadBalancerInterceptor负载均衡拦截器的intercept方法，该方法调用execute方法。
     * （4）而在execute方法中，主要有两个方法:
     * （4.1）ILoadBalancer loadBalancer = getLoadBalancer(serviceId)：通过getLoadBalancer获取ILoadBalancer实例
     * （4.2）Server server = getServer(loadBalancer, hint)：再通过getServer获取Server实例。
     * （5）getLoadBalancer最终会调用Ribbon的ServerList接口
     * （6）Nacos实现类NacosServerList实现了ServerList接口。
     * （7）总之我们在进行微服务调用的时候，Ribbon最终会调用NacosServerList类中的getUpdatedListOfServers方法。
     * （8）最终就会获取到我们注册到注册中心的微服务实例
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}
